
let crypto = require('crypto');//加密模块
const {SECRECT}=require('../utils/CONSTANT');
/*
    jwt: 头部、荷载、签名
*/

//头部  header
let header = {
    'typ': 'JWT',       //声明类型
    'alg': 'HS256'      //声明加密的算法  hs256
};

//playload 荷载
//标准声明
//私有声明
//公共声明
let playload = {
    iat: Date.now(),     //jwt的签发时间
    exp: Date.now() + 1000 * 60 * 60    //过期时间      60分钟
};

//将json对象转换为base64
function jsonToBase64(obj) {
    let buf = Buffer.from(JSON.stringify(obj));
    return buf.toString('base64');
}

//将base64格式的字符串转换为json对象
function base64ToJson(str) {
    let buf = Buffer.from(str, 'base64');
    return JSON.parse(buf.toString());
}

//加密算法
function HS256(header, playload) {
    let hmac = crypto.createHmac('sha256', SECRECT);//生成加密对象，且指定秘钥为ujiuye
    let s = `${header}.${playload}`;//将base64格式的header和playload使用.拼起来
    hmac.update(s);//将数据放入加密对象
    return hmac.digest('base64');//将base64格式加密数据返回
}

//生成jwt
//h base64格式的header
//p base64格式的playload
function generator(h,p) {
    //base64格式的header
    // let h = jsonToBase64(header);
    // let p = jsonToBase64(playload);//base64格式的playload
    let s = HS256(h, p);//签名
    return `${h}.${p}.${s}`;//jwt
}


//导出模块
module.exports={
    header,
    playload,
    base64ToJson,
    jsonToBase64,
    HS256,
    generator
};